// 数组划分、数组分块
// 两个指针将数组划分三块：已经处理过的区间（分两块：非零元素区间，零元素区间），未处理的区间

// 例题 1：
// 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
//
//        请注意 ，必须在不复制数组的情况下原地对数组进行操作。

//        示例 1:
//        输入: nums = [0,1,0,3,12]
//        输出: [1,3,12,0,0]

//        示例 2:
//        输入: nums = [0]
//        输出: [0]

//        提示:
//
//        1 <= nums.length <= 104
//        -231 <= nums[i] <= 231 - 1

// 解题思路：
//  right 负责扫描数组，识别 0 元素和非 0 元素
//  left 负载维护非零元素的区间
//  [0, left]: 非零元素区间，  [left + 1, right - 1]: 0 元素区间，  [right, n - 1]:待处理区间

class MoveZeroes {
    public void moveZeroes(int[] nums) {
        int n = nums.length;
        int left = -1;
        int right = 0;
        while(right < n){
            if(nums[right] != 0) {
                left++;
                int tmp = nums[left];
                nums[left] = nums[right];
                nums[right] = tmp;
            }
            right++;
        }
    }
}